/*
 * @ Created with Clion
 * @ Author Morbid
 * @ Date 2022/06/10
 * @ Time 12:06
 */

/*!
 * 定义顺序表
 * 实现顺序表基本操作
 */

#include <cstdlib>

#define InitSize 10
typedef char ElemType;

typedef struct {
    ElemType *data;
    int length;
    int MaxSize;
} SeqList;

/*!
 * 初始化顺序表
 * @param L 结构体变量名
 */

void InitList(SeqList &L) {
    L.data = (ElemType *) malloc(InitSize * sizeof(ElemType));
    L.length = 0;
    L.MaxSize = InitSize;
}

/*!
 * 增加动态数组长度
 * @param L 顺序表
 * @param length 增加长度
 */
void IncreaseSize(SeqList &L, int length) {
    ElemType *p = L.data;
    L.data = (ElemType *) malloc((L.length + length) * sizeof(ElemType));
    for (int i = 0; i < L.length; i++)
        *(L.data + i) = *(p + i);
    L.MaxSize += length;
    free(p);
}

/*!
 * 在指定位置插入元素
 * @param L 顺序表
 * @param i 要插入的位置
 * @param e 要插入的元素
 * @return  插入成功返回true，否则返回false
 */
bool ListInsert(SeqList &L, int i, ElemType e) {
    if (i < 1 || i > L.length + 1 || L.length == L.MaxSize)
        return false;
    for (int j = L.length; j >= i; j--)
        *(L.data + j) = *(L.data + j - 1);
    *(L.data + i - 1) = e;
    L.length++;
    return true;
}

/*!
 * 删除指定位置的元素，并将该元素传入第三个参数
 * @param L 顺序表
 * @param i 要删除的元素位置
 * @param e 存放要删除元素的参数
 * @return  删除成功返回true，否则返回false
 */
bool ListDelete(SeqList &L, int i, ElemType &e) {
    if (i < 1 || i > L.length)
        return false;
    e = *(L.data + i - 1);
    for (int j = i; j < L.length; j++)
        *(L.data + j - 1) = *(L.data + j);
    L.length--;
    return true;
}

/*!
 * 根据位置获取元素内容
 * @param L 顺序表
 * @param i 要获取的元素位置
 * @return  元素的内容
 */
ElemType GetElem(SeqList &L, int i) {
    if (i < 1 || i > L.length)
        return -1;
    return *(L.data + i - 1);
}

/*!
 * 获取指定元素的第一个位置
 * @param L 顺序表
 * @param e 要查找的值
 * @return  查找到的元素位置
 */
int LocateElem(SeqList L, ElemType e) {
    for (int i = 0; i < L.length; i++)
        if (*(L.data + i) == e)
            return i + 1;
    return -1;
}